パッケージの仕方で気づいたこと
- 2009 年 3月 9 日
パッケージの仕方で小一時間転んだので記録。
ドキュメントクラスをIndexにTestClassのインスタンスを作り、TestClassのメソッドを実行する場合を想定します。
Index.as index.fla testclass/ TestClass.as
ってファイル構成で、TestClass.asの中身は、
package testclass{ public class TestClass{ public function TestClass(){} public function testMethod():void{ trace("testMethod"); } } } |
Index.asで、TestClassのインスタンスを作って、testMethodを実行したら「testMethod」ってtraceされるハズ。
package{ import flash.display.Sprite; import testclass.TestClass; public class Index extends Sprite{ public function Index(){ this.testclass = new TestClass(); this.testclass.testMethod(); } public var testclass:TestClass; } } |
しかし、これは「1061: 未定義である可能性のあるメソッド testMethod を、静的型 Index の参照を使用して呼び出しました。」となって正しく動かないです。
同じファイル構成でも以下のIndex.asだと動きます。
package{ import flash.display.Sprite; import testclass.TestClass; public class Index extends Sprite{ public function Index(){ this.testClass = new TestClass(); this.testClass.testMethod(); } public var testClass:TestClass; } } |
何が違うんだというと、public var testClassとpublic var testclassの大文字・小文字の違い。この場合小文字だと、package名のtestclassと衝突して正しく動かないっぽい。
でも、以下のファイル構成だと問題なく動くのです。
index.fla myproject/ Index.as testclass/ TestClass.as
myprojectでパッケージする分、TextClassとIndex.asは冒頭の部分が以下のように変わるのだけれどこれだと動く。
package myproject.testclass{ public class TestClass{ public function TestClass(){} public function testMethod():void{ trace("testMethod"); } } } |
package myproject{ import flash.display.Sprite; import myproject.testclass.TestClass; public class Index extends Sprite{ public function Index(){ this.testclass = new TestClass(); this.testclass.testMethod(); } public var testclass:TestClass; } } |
作る時のファイル構成や名前付けなんて自由でいいと思うけれど、気をつけないとこういうこともあるんだなぁと。最後のファイル構成はProgressionでデフォルトでプロジェクトを生成した時に習っているのだけれど、myprojectでパッケージになっているのは理に適っているのですね。